package com.wangbo.box.templateMethod;

/**
 * 模版方法模式  例如AQS
 * <p>
 * 定义一个操作中的算法骨架，而将算法的一些步骤延迟到子类中，使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
 */
public class TemplateMethodPattern {

    static abstract class TemplateMethod {
        int num = 0;

        void invoke() {
            basicMethod();
            if (methodA()) {
                methodB();
            }
            System.out.println(num);
        }

        void basicMethod() {
            num += 1;
        }

        abstract boolean methodA();

        abstract void methodB();
    }

    static class MultiMethod extends TemplateMethod {

        @Override
        boolean methodA() {
            return num >= 1;
        }

        @Override
        void methodB() {
            num *= 100;
        }
    }

    public static void main(String[] args) {
        TemplateMethod multi = new MultiMethod();
        multi.invoke();
    }
}
